#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>
//   I/O多路转接
//   select系统调用是用来让我们的程序监视多个文件描述符的状态变化的
//   程序会停在select这里等待，直到被监视的文件描述符有一个或多个发生了状态改变

int main()
{
    fd_set read_fds;
    FD_ZERO(&read_fds);
    FD_SET(0, &read_fds);
    while (1)
    {
        printf(">");
        fflush(stdout);
        int ret = select(1, &read_fds, NULL, NULL, NULL);
        if (ret < 0)
        {
            perror("select_error");
            continue;
        }
        if (FD_ISSET(0, &read_fds)) // 用来测试描述词组set中相关fd 的位是否为真
        {
            char buf[1024] = {0};
            read(0, buf, sizeof(buf) - 1);
            printf("input: %s\n", buf);
        }
        else
        {
            printf("error! invalid fd\n");
            continue;
        }
        FD_ZERO(&read_fds);
        FD_SET(0, &read_fds);
    }
    return 0;
}